# @Time : 2020/7/28 11:28
# @Author : Fioman 
# @Phone : 13149920693
import cv2 as cv
import numpy as np

"""
在离散空间上,有很多方法可以用来计算近似的导数,在使用3*3的Sobel算子时,二坑计算结果并不太精准.
Opencv提供了Scharr算子,该算子具有和Sobel算子同样的速度,且精度更高.可以将Scharr算子看作是对Sobel算子的改进.
其核通常是:
-3  0  3
-10 0  10
-3  0  3

-3  -10  -3
0   0    10
3   10   3
当使用Sobel算子的时候将dsize=-1的时候,就使用Scharr算子的核来进行计算.
Scharr算子和Sobel算子不一样的地方在于,Scharr算子的求导参数dx和dy,必须满足条件:
dx >=0 && dy >= 0 && dx+dy == 1
"""
img = cv.imread("test.bmp", cv.IMREAD_GRAYSCALE)
scharrX = cv.Scharr(img, ddepth=cv.CV_64F, dx=1, dy=0)
scharrX = cv.convertScaleAbs(scharrX)
scharrY = cv.Scharr(img, ddepth=cv.CV_64F, dx=0, dy=1)
scharrY = cv.convertScaleAbs(scharrY)
scharrXY = cv.addWeighted(scharrX, 1, scharrY, 1, 0)

cv.imshow("Original", img)
cv.imshow("ScharrX", scharrX)
cv.imshow("ScharrY", scharrY)
cv.imshow("ScharrXY", scharrXY)

cv.waitKey(0)
cv.destroyAllWindows()
